#ifndef __FREE_LOCK_RES_QUEUE__
#define __FREE_LOCK_RES_QUEUE__
#include "lock.h"
/*************************************************************
* res_queue_t
* 功能 : 资源分配器
* 应用 : 对固定资源的分配(不支持扩容)
* 优点 : 以O(1)的效率获取资源,高效
*        释放安全,检测重复释放
*        线程安全,支持并发读写
**************************************************************/
typedef struct {
    unsigned int q_size;    //Queue 总容量
    unsigned int cnt;       //当前(已)使用的容量
    unsigned int w;         //写入端index
    unsigned int r;         //读出端index
    LOCK_DEFINE(lock_r);
    LOCK_DEFINE(lock_w);
    unsigned int data[0];   //data区间
} res_queue_t;

/*************************************************************
* 功能  : 资源分配器初始化
* 参数  :
*        @q_size : 资源总个数(队列深度)
* 返回值: 
*         成功,返回非NULL的指针
*         失败,返回NULL
**************************************************************/
res_queue_t* queue_res_init(unsigned int q_size);

/*************************************************************
* 功能  : 向资源分配器申请资源
* 参数  :
*        @q : 资源分配器(指针)
* 返回值: 
*         成功,返回资源index
*         失败,返回 -1
**************************************************************/
unsigned int queue_res_apply(res_queue_t* q);

/*************************************************************
* 功能  : 向资源分配器释放资源
* 参数  :
*        @q : 资源分配器(指针)
*        @id: 释放资源的index id
* 返回值: 
*         成功,返回 0
*         失败,返回 -1
**************************************************************/
unsigned int queue_res_release(res_queue_t* q,unsigned int id);

/*************************************************************
* 功能 : 查看资源分配器内部状态
**************************************************************/
void dump_res_queue(res_queue_t* q);

#endif